主要測在 controller 的 action,基本的 CRUD action,或是一些response是否正確、redirect 網址是否正確為主,可以用 restful http 的動詞來撰寫測試
require 'rails_helper'
RSpec.describe CollectionsController, type: :controller do
describe 'Get #index' do
it 'when resource is found' do
get :index
collection = create(:collection)
expect(response.status).to eq 200
expect(assigns(:collection)).to eq([collection])
end
end
describe 'Post #create' do
it 'redirect to index when create collection success' do
post :create, params: { collection: { title: '11', description: '222' } }
expect(response).to redirect_to(collections_path)
expect(Collection.count).to eq 1
end
end
describe 'Get #show' do
let(:collection) { create(:collection) }
it 'redirect to index when create collection success' do
get :show, params: { id: collection }
expect(response).to have_http_status(200)
expect(response).to render_template(:show)
end
end
end
起手式都是以 get 、 post 、 put/patch 、 delete 為主,後方接 :action
,若有需要 params,則在最後新增
以 post :create
為例
post :create
=> 以 Post 方式打到 :create
的 action
params
=> 跟你平常新增一筆資料一樣一定會需要params,直接在後方加上參數即可
redirect_to
=> 其中一種 matchers,期望新增完成後會轉址到index
。
另外還有
have_http_status
=> 期望此 response
狀態碼為多少?
你也可以使用 response.status
查看 status_code 為多少
render_template
=> 期望此 response
會渲染哪一個頁面?
assigns()
=> 為此 action 的 instance variable,比如寫assigns(:collection)
則表示在 index 有一個 @collection
還有更多 matchers 跟應用可以參考這裡
至於 assigns
現在已經被拋棄無法使用了如果你是較新版的 Rails,如果真的要使用的話可以安裝 rails-controller-testing
這篇也有講為何不要在測試上測試 instance variable